package week7.ww;

/**
 * Wachwoord Klasse
 * Practicumopgave Programmeren I
  * @author W.Looge & R. Oost
  * @version 1.0
  */
public class Wachtwoord {

    // ------------------ Instantievariabelen ----------------
    
    /**
     * String die het standaardwachtwoord bevat
     */
    // public static final String BEGINWOORD = "default0";
    
    /**
     * String die het wachtwoord bevat
     */
    private String pass;
    
    /**
     * De controleur die door dit Wachtwoord wordt gebruikt
     */
    private Controleur controleur;
    
    /**
     * Het beginwoord van die wachtwoord
     */
    private String beginwoord;
    
    // ------------------ Constructors ------------------------
    
    /**
     * Construeert een nieuw Wachtwoord object, met als
     * wachtwoord een gegenereerd wachtwoord en als Controleur de meegegeven Controleur.
     * @ensure getControleur().acceptabel(getBeginwoord()).
     */
    public Wachtwoord(Controleur controleur) {
    	this.controleur = controleur;
    	this.beginwoord = controleur.genereerWoord();
        this.pass = this.beginwoord;
    }
    
    /**
     * Construeert een nieuw Wachtwoord object, met als
     * wachtwoord een gegenereerd wachtwoord en als Controleur een StandaardControleur.
     * @ensure getControleur().acceptabel(getBeginwoord()).
     */
    public Wachtwoord() {
    	this(new StandaardControleur());
    }
    
    // ------------------ Aanvragen --------------------------
    
    /**
     * Controleert of het voorgestelde wachtwoord aan de eisen voor een wachtwoord voldoet.
     * Deze functie wordt gedelegeerd naar het opgeslagen Controleur-object.
     * @param voorstel <code>String</code> die het voorgestelde wachtwoord bevat.
     * @return <code>true</code> als het een acceptable wachtwoord is; <code>false</code> als het een onacceptable wachtwoord is.
     */
    public boolean acceptabel(String voorstel) {
    	return this.controleur.acceptabel(voorstel);
    }
    
    /**
     * Verandert het wachtwoord in een ander wachtwoord. Hierbij is ook het oude wachtwoord vereist.
     * Controleert ook of het nieuwe wachtwoord een acceptable wachtwoord is.
     * @param oud <code>String</code> met het oude wachtwoord.
     * @param nieuw <code>String</code> met het nieuwe wachtwoord.
     * @return <code>true</code> als het veranderen is gelukt; <code>false</code> als het veranderen niet is gelukt.
     * @require <code>oud</code> is gelijk aan het huidige wachtwoord.
     * @require <code>nieuw</code> is een acceptabel wachtwoord.
     * @ensure <code>nieuw</code> is het nieuw wachtwoord.
     */
    public boolean setWoord(String oud, String nieuw) {
        if (this.testWoord(oud) && this.acceptabel(nieuw)) {
            this.pass = nieuw;
            return true;
        }
        return false;
    }
    
    /**
     * Controleert of het test wachtwoord gelijk is aan het echte wachtwoord.
     * @param test String met het te testen wachtwoord.
     * @return <code>true</code> als het gelijk is; <code>false</code> als het niet gelijk is.
     * @ensure <code>test</code> is een acceptabel wachtwoord.
     */
    public boolean testWoord(String test) {
        if (test!=null && test.equals(this.pass)) {
            return true;
        }
        return false;
    }
    
    /**
     * Levert de controleur op die door deze klass wordt gebruikt.
     * @return Controleur De controleur die door deze klasse wordt gebruikt.
     */
    public Controleur getControleur() {
    	return controleur;
    }
    
    /**
     * Levert het beginwoord op dat door deze klasse wordt gebruikt.
     * @return String Het beginwoord dat door deze klasse wordt gebruikt.
     */
    public String getBeginwoord() {
		return beginwoord;
    }
}
